package com.paradogs.framework.core.utils;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author: yumi
 * @date: 2023/9/23  9:57
 * @Description: 反射工具类
 */
@Slf4j
public class ReflectUtils {

    /**
     * 获取返回类中的泛型类型
     * @param method
     * @return
     */
    public static Class<?> getGenericReturnType(Method method) {
        // 获取方法的返回类型信息
        Type type = method.getGenericReturnType();
        // 判断返回类型是否为参数化类型（即带有泛型参数）
        if (type instanceof ParameterizedType) {
            // 获取泛型参数的实际类型
            Type typeArg = ((ParameterizedType) type).getActualTypeArguments()[0];
            // 判断实际类型是否为 Class 对象
            if (typeArg instanceof Class) {
                // 将实际类型转换为 Class 对象
                return (Class<?>) typeArg;
            }
        }
        return null;
    }

    /**
     * 调用 setter 方法
     * @param obj
     * @param fieldName
     * @param value
     */
    public static void callSetter(Object obj, String fieldName, Object value) {
        try {
            String methodName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
            Method method = findMethod(obj.getClass(), methodName, value.getClass());
            if (method != null) {
                method.invoke(obj, value);
            }
        } catch (Exception e) {
            // 处理异常
            log.error("setter error, field: {}, value: {}, {}", fieldName, value, e.getMessage(), e);
        }
    }
    private static Method findMethod(Class<?> clazz, String methodName, Class<?> parameterType) {
        try {
            return clazz.getMethod(methodName, parameterType);
        } catch (NoSuchMethodException e) {
            return null;
        }
    }

}
